home *** CD-ROM | disk | FTP | other *** search
/ Aminet 49 / Aminet 49 (2002)(GTI - Schatztruhe)[!][Jun 2002].iso / Aminet / dev / gui / Feelin.lha / Feelin / Class3.e < prev    next >
Text File  |  2002-03-14  |  7KB  |  216 lines

  1. OPT PREPROCESS
  2.  
  3. MODULE 'intuition/intuition',
  4.        'feelin','libraries/feelin','a4'
  5.  
  6. -> This is the instance data for our custom class.
  7.  
  8. OBJECT mydata
  9.   x:INT,y:INT
  10.   sx:INT,sy:INT
  11. ENDOBJECT
  12.  
  13. PROC main()
  14.    DEF c,w,myobj,
  15.        fcc:PTR TO feelinClass
  16.  
  17.    sys_SGlob()
  18.  
  19.    IF feelinbase := OpenLibrary('feelin.library',FV_VERSION)
  20. /*
  21. Create the new custom class with a call to F_CreateClass().
  22.  
  23. This function returns a feelinClass structure. You  must  use  class.id  to
  24. create  instance  of  your  custom  class.  This  ID  is unique and made by
  25. F_CreateClass() when ID is NIL.
  26. */
  27.  
  28.       IF fcc := F_CreateClass(NIL,FC_Area,NIL,SIZEOF mydata,{myDispatcher})
  29.          c := ClientObject,
  30.             Child, w := WindowObject, FA_Window_Title, 'A rather complex custom class',
  31.                Child, VGroup, NoFrame,
  32.                   Child, TextObject, FA_FixedHeight,TRUE, DontChain, TextFrame, TextBack, FA_Text, '`c`iPaint `nwith `bmouse`n,\n`iScroll `nwith `bcursor keys`n.', End,
  33.                   Child, myobj := F_NewObjA(fcc.id,[TextFrame, TAG_DONE]),
  34.                End,
  35.  
  36.                FA_Window_ActiveObject, myobj, -> Safe here
  37.             End,
  38.          End
  39.  
  40.          IF c
  41.             F_DoA(w,FM_Notify,[FA_Window_CloseRequest,TRUE, c,2,FM_Client_ReturnID,FV_Client_Quit])
  42.             F_Set(w,FA_Window_Open,TRUE)
  43.  
  44.             WHILE F_DoA(c,FM_Client_WaitEvent,NIL) <> FV_Client_Quit DO NOP
  45.  
  46.             F_DisposeObj(c)
  47.          ENDIF
  48.  
  49.          F_RemoveClass(fcc)
  50.       ELSE
  51.          WriteF('Could not create custom class.\n')
  52.       ENDIF
  53.  
  54.       CloseLibrary(feelinbase)
  55.    ELSE
  56.       WriteF('Failed to open feelin.library\n')
  57.    ENDIF
  58. ENDPROC
  59.  
  60. PROC myDispatcher(cl=A2:PTR TO feelinClass,obj=A0:PTR TO feelinObject,method=D0,args=A1:PTR TO LONG)
  61.    DEF data:PTR TO mydata
  62.  
  63.    sys_RGlob() ; data := INST_DATA(cl,obj)
  64.  
  65. /*
  66. Here comes the dispatcher for our custom class. Unknown/unused methods  are
  67. passed to the superclass immediately.
  68. */
  69.  
  70.    SELECT method
  71.       CASE FM_AskMinMax   ;        mAskMinMax   (cl,obj)
  72.       CASE FM_Draw        ;        mDraw        (cl,obj,data,args)
  73.       CASE FM_HandleEvent ; RETURN mHandleEvent (obj,data,args)
  74.       CASE FM_Active      ;        mActive      (cl,obj,TRUE)
  75.       CASE FM_Inactive    ;        mActive      (cl,obj,FALSE)
  76.       DEFAULT             ; RETURN F_SuperDoA   (cl,obj,method,args)
  77.    ENDSELECT
  78. ENDPROC 
  79. PROC mAskMinMax(cl,obj:PTR TO feelinObject)
  80. /*
  81.    Area.AskMinMax() will be called before the window is opened. We need  to
  82.    tell Feelin the minimum and maximum size of our object.
  83.  
  84.    When you are the first receiving  the  method  the  fields  _minw()  and
  85.    _minh() are set to zero and the fields _maxw() and _maxh() to FV_MAXMAX.
  86.    We can add values to _minw() and _minh() or set _maxw() and  _maxh()  if
  87.    we need to. Then we pass the method to our superclass.
  88.  
  89.    When the method  reaches  Area  class  these  values  will  be  adjusted
  90.    according to FA_MinXxx, FA_FixedXxx and FA_FixXxx attributes.
  91. */
  92.  
  93.    _minw(obj) += 100 ; _minh(obj) += 40
  94.    _maxw(obj) := 500 ; _maxh(obj) := 300
  95.  
  96.    F_SuperDoA(cl,obj,FM_AskMinMax,NIL)
  97. ENDPROC
  98. PROC mDraw(cl,obj:PTR TO feelinObject,data:PTR TO mydata,d:PTR TO FS_Draw)
  99. /*
  100.    Draw method is called whenever Feelin feels (obviously  ;-))  we  should
  101.    render  our object. This usually happens after layout is finished. Note:
  102.    You may only render within the rectangle _mleft(),  _mtop(),  _mwidth(),
  103.    _mheight().
  104. */
  105.  
  106.    DEF rp
  107.  
  108. /*
  109.    Let our superclass draw itself first, Area class  would  e.g.  draw  the
  110.    frame and clear the whole region. What it does exactly depends on flags.
  111. */
  112.  
  113.    F_SuperDoA(cl,obj,FM_Draw,d)
  114.  
  115. /*
  116.    IF FF_Draw_Object isn't set, we shouldn't  draw  anything.  Feelin  just
  117.    wanted to update the frame or something like that.
  118. */
  119.  
  120.    rp := _rp(obj)
  121.  
  122.    IF d.flags AND FF_Draw_Update -> called from our input method
  123.       IF data.sx OR data.sy
  124.          _BPen(_pen(obj,FV_Pen_Shine))
  125.          ScrollRaster(rp,data.sx,data.sy,_mleft(obj),_mtop(obj),_mright(obj),_mbottom(obj))
  126.          _BPen(_pen(obj,FV_Pen_Dark))
  127.          data.sx := NIL
  128.          data.sy := NIL
  129.       ELSE
  130.          _APen(_pen(obj,FV_Pen_Shadow))
  131.          _Plot(data.x,data.y)
  132.       ENDIF
  133.    ELSEIF d.flags AND FF_Draw_Object
  134.       _APen(_pen(obj,FV_Pen_Shine))
  135.       _Boxf(_mleft(obj),_mtop(obj),_mright(obj),_mbottom(obj))
  136.    ENDIF
  137. ENDPROC
  138. PROC mActive(cl,obj:PTR TO feelinObject,state)
  139. /*
  140.    Area class always creates an EventHandler  structure  in  case  of  some
  141.    inputmodes.  As  we handle events instead of Area class we can use it as
  142.    we want. It will save us some allocations ;-)
  143.  
  144.    Using F_ModifyHandler() to modify IDCMP flags it's a piece  of  cake  to
  145.    request IDCMP events.
  146. */
  147.  
  148.    IF state
  149.       F_ModifyHandler(_handler(obj),IDCMP_RAWKEY OR IDCMP_MOUSEBUTTONS,NIL)
  150.    ELSE
  151.       F_ModifyHandler(_handler(obj),NIL,IDCMP_RAWKEY OR IDCMP_MOUSEBUTTONS)
  152.    ENDIF
  153.  
  154.    F_SuperDoA(cl,obj,IF state THEN FM_Active ELSE FM_Inactive,NIL)
  155. ENDPROC
  156. PROC mHandleEvent(obj:PTR TO feelinObject,data:PTR TO mydata,he:PTR TO FS_HandleEvent)
  157. /*
  158. in mSetup() we said that we want get a  message  if  mousebuttons  or  keys
  159. pressed so we have to define the input-handler
  160.  
  161. Note :
  162.  
  163.    This is really a good example, because it  shows  how  to  use  critical
  164.    events carefully:
  165.  
  166.    IDCMP_MOUSEMOVE is only needed when left-mousebutton is pressed,  so  we
  167.    dont  request  this  until  we  get  a  SELECTDOWN-message and we reject
  168.    IDCMP_MOUSEMOVE immeditly after we get a SELECTUP-message
  169. */
  170.  
  171.    #define _between(a,x,b) (x == [a TO b])
  172.    #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright(obj)) AND _between(_mtop(obj),(y),_mbottom(obj)))
  173.  
  174. /*
  175. Note on Arrows handling :
  176.  
  177. If you don't handle arrows return NIL, this will  allow  Window  object  to
  178. cycle   through  its  chain  using  arrows  instead  of  tabulations  (more
  179. confortable hu ?), else return your object. Currently, result is only check
  180. against NIL, but this may change in future, so return your object.
  181. */
  182.  
  183.    IF he.key <> FK_NONE
  184.       SELECT he.key
  185.          CASE FK_LEFT  ; data.sx := -1
  186.          CASE FK_RIGHT ; data.sx :=  1
  187.          CASE FK_UP    ; data.sy := -1
  188.          CASE FK_DOWN  ; data.sy :=  1
  189.          DEFAULT       ; RETURN NIL
  190.       ENDSELECT
  191.  
  192.       F_Draw(obj,FF_Draw_Update)
  193.  
  194.       RETURN obj -> Forbid arrow cycling, because *WE* handle key events.
  195.    ELSEIF he.msg.class = IDCMP_MOUSEBUTTONS
  196.       IF he.msg.code = SELECTDOWN
  197.          IF _isinobject(he.msg.mousex,he.msg.mousey)
  198.             data.x := he.msg.mousex
  199.             data.y := he.msg.mousey
  200.             F_Draw(obj,FF_Draw_Update)
  201.             -> Only request IDCMP_MOUSEMOVE if we realy need it
  202.             F_ModifyHandler(_handler(obj),IDCMP_MOUSEMOVE,NIL)
  203.          ENDIF
  204.       ELSE
  205.          -> Reject IDCMP_MOUSEMOVE because lmb is no longer pressed
  206.          F_ModifyHandler(_handler(obj),NIL,IDCMP_MOUSEMOVE)
  207.       ENDIF
  208.    ELSEIF he.msg.class = IDCMP_MOUSEMOVE
  209.       IF _isinobject(he.msg.mousex,he.msg.mousey)
  210.          data.x := he.msg.mousex
  211.          data.y := he.msg.mousey
  212.          F_Draw(obj,FF_Draw_Update)
  213.       ENDIF
  214.    ENDIF
  215. ENDPROC
  216.